// 版权归 Epic Games, Inc. 所有。保留所有权利。

#include "LyraListView.h"
#include "LyraWidgetFactory.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraListView)

#if WITH_EDITOR
#include "Editor/WidgetCompilerLog.h"
#endif

#define LOCTEXT_NAMESPACE "LyraListView"

/**
 * 构造函数实现
 * @param ObjectInitializer 对象初始化器
 */
ULyraListView::ULyraListView(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer) // 调用父类构造函数
{
}

#if WITH_EDITOR

/**
 * 验证编译默认值实现
 * @param InCompileLog 编译日志接口
 */
void ULyraListView::ValidateCompiledDefaults(IWidgetCompilerLog& InCompileLog) const
{
	Super::ValidateCompiledDefaults(InCompileLog); // 调用父类验证

	// 检查工厂规则是否为空
	if (FactoryRules.Num() == 0)
	{
		InCompileLog.Error(FText::Format(FText::FromString("{0} 没有定义工厂规则，没有规则无法创建控件。"), FText::FromString(GetName())));
	}
}

#endif

/**
 * 内部生成条目控件实现
 * @param Item 数据项
 * @param DesiredEntryClass 期望的条目类
 * @param OwnerTable 所属表格视图
 * @return 生成的用户控件引用
 */
UUserWidget& ULyraListView::OnGenerateEntryWidgetInternal(UObject* Item, TSubclassOf<UUserWidget> DesiredEntryClass, const TSharedRef<STableViewBase>& OwnerTable)
{
	TSubclassOf<UUserWidget> WidgetClass = DesiredEntryClass; // 初始化为期望的条目类
	
	// 遍历工厂规则寻找匹配的控件类
	for (const ULyraWidgetFactory* Rule : FactoryRules)
	{
		if (Rule) // 规则有效
		{
			if (const TSubclassOf<UUserWidget> EntryClass = Rule->FindWidgetClassForData(Item)) // 找到匹配的控件类
			{
				WidgetClass = EntryClass; // 更新控件类
				break; // 跳出循环
			}
		}
	}
	
	// 生成并返回类型化条目
	UUserWidget& EntryWidget = GenerateTypedEntry<UUserWidget>(WidgetClass, OwnerTable);

	return EntryWidget; // 返回条目控件
}

#undef LOCTEXT_NAMESPACE